package com.jsnkj.basic.photo

import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView

/**
 *
 * @功能描述:
 * @创建时间:     2022/1/4
 * @创建者:       阳
 * @修改时间:     2022/1/4
 * @修改者:       阳
 */
class RecycItemTouchHelperCallback(
    var mItemListener: RecyclerMoveListener,
    var mIsVertical: Boolean = false,
    var mIsDelete: Boolean = true
) : ItemTouchHelper.Callback() {


    /**
     * 是否拦截最后一个holder 参与 交换位置 （剪辑-->排序）
     *
     * @param unEnableLastDrag true 最后一项不参与排序
     */
    fun setUnEnableLastDrag(unEnableLastDrag: Boolean) {
        this.unEnableLastDrag = unEnableLastDrag
    }

    private var unEnableLastDrag = false

    /**
     * RecyclerView拦截向上滑动，向下滑动，想左滑动
     * callback回调监听先调用的，用来判断是什么动作，比如判断方向（意思就是我要监听那个方向的拖到）
     */
    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {
        val layoutManager = recyclerView.layoutManager
        return if (layoutManager is GridLayoutManager) {
            // 如果是Grid布局，则不能滑动，只能上下左右拖动
            val dragFlags: Int =
                if (unEnableLastDrag && viewHolder.adapterPosition == recyclerView.adapter!!.itemCount - 1) { //最后一项不参与排序
                    0
                } else {
                    ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
                }
            val swipeFlags = 0
            //拖拽flag  ，删除flag
            makeMovementFlags(dragFlags, swipeFlags)
        } else {
            if (mIsVertical) {
                val dragFlags: Int =
                    if (unEnableLastDrag && viewHolder.adapterPosition == recyclerView.adapter!!.itemCount - 1) { //最后一项不参与排序
                        0
                    } else {
                        ItemTouchHelper.UP or ItemTouchHelper.DOWN
                    }
                makeMovementFlags(
                    dragFlags,
                    if (mIsDelete) ItemTouchHelper.RIGHT or ItemTouchHelper.LEFT else 0
                )
            } else {
                val dragFlags: Int =
                    if (unEnableLastDrag && viewHolder.adapterPosition == recyclerView.adapter!!.itemCount - 1) { //最后一项不参与排序
                        0
                    } else {
                        ItemTouchHelper.RIGHT or ItemTouchHelper.LEFT
                    }
                makeMovementFlags(
                    dragFlags,
                    if (mIsDelete) ItemTouchHelper.UP or ItemTouchHelper.DOWN else 0
                )
            }
        }
    }

    /**
     * drag状态下，在canDropOver()返回true时，会调用该方法让我们拖动换位置的逻辑(需要自己处理变换位置的逻辑)
     * 当移动的时候回调的方法
     */
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        //adapter.notifyItemMoved(fromPosition，toPosition);改变拖拽item位置
        //不同type不允许移动
//        if (viewHolder.itemViewType != target.itemViewType) {
//            return false
//        }
        return if (mItemListener != null) {
            mItemListener!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
        } else true
    }

    //侧滑
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        //监听侧滑1:删除数据；    2：adapter.notifyItemRemove（position）
        if (mItemListener != null) {
            mItemListener!!.onItemRemove(viewHolder.adapterPosition)
        }
    }

    override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
        super.clearView(recyclerView!!, viewHolder!!)
        if (mItemListener != null) {
            mItemListener!!.clearView(viewHolder, recyclerView)
        }
    }

    /**
     * 针对swipe和drag状态，当swipe或者drag对应的ViewHolder改变的时候调用
     * 我们可以通过重写这个函数获取到swipe、drag开始和结束时机，viewHolder 不为空的时候是开始，空的时候是结束
     */
    override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
        super.onSelectedChanged(viewHolder, actionState)
        //actionState的取值有ACTION_STATE_IDLE/ACTION_STATE_SWIPE/ACTION_STATE_DRAG
        if (mItemListener != null) {
            mItemListener!!.onSelectedChanged(viewHolder, actionState)
        }
    }

    override fun isLongPressDragEnabled(): Boolean {
        //是否允许长按拖拽
        return if (mItemListener == null) {
            false
        } else mItemListener!!.isLongPressDragEnabled()
    }

    override fun isItemViewSwipeEnabled(): Boolean {
//        // item是否支持滑动
//        return if (mItemListener == null || !mIsDelete) {
//            false
//        } else mItemListener!!.isItemViewSwipeEnabled()
        return false
    }
}
